Последние изменения - Поиск:

edit SideBar

Go /

КакСделатьЛокальноеХранениеЕщёЛучше

Читая https://github.com/cosmos72/gls , видим, что на каждое обращение к TLS нужно блокировать мьютекс. Это плохо. Как сделать лучше?

  • можно задать максимальное допустимое значение goid при старте программы и сделать массив. Хотя они говорят, что массивы - не thread-safe (странно, как они умудрились этого добиться). См. немного про безопасность массивов. На худой конец, можно сделать массив указателей на стр-ру, который заполняется в момент запуска программы. Теперь обращение к массиву из горутин будет только для чтения, а указатели на стр-ру принадлежат только одной горутине по построению.
  • ещё тупее - завести столько глобальных переменных, сколько возможно goid-ов, и огромный case, который будет выбирать из них одну. Можно даже расширять, если эту ф-ю записать в переменную и обновлять её, когда горутин стало слишком много для старой функции.
  • открыть всю структуру g (она находится в src/runtime/runtime2.go и ищется по "type g struct"), как делалось в Дельфи в подобных случаях.

И найти в ней подобающее место. Например, ancestors или m, или gopc.

  • есть sync/atomic, хотя атомики - это вроде тоже зло (блокируют системную шину)
  • хранить данные в стеке. Для начала, нужно открыть Func struct (живёт в src/runtime/runtime2.go). Затем, сделать замыкание, к-рое будет содержать нужные нам данные. Затем, научиться эти данные видеть через стек. По ходу дела нужно будет научиться читать стек снизу, а не сверху, как сейчас. Или, может быть, просто сделать обычную функцию и передавать объект "хранилище локальных для горутины данных" как параметр. По сути, чтение переменных из стека умеет делать отладчик.
  • Написать что-то на Си. Т.е. тупо реализовать массив объектов TLS на Си. Вопрос только, как быть со сборкой мусора.
  • Подмена функций - см http://www.alangpierce.com/blog/2016/03/17/adventures-in-go-accessing-unexported-functions/

P.S. С учётом массивной параллельности, надо, чтобы хранилище всё же жило в стеке. В идеальном мире горутины будут выполняться на разных машинах, тогда любое глобальное хранение будет дико дорогим. Вот как обстоит дело с выделением на стеке: https://stackoverflow.com/a/10866871/9469533 - оно есть, но исчезает, как только мы берём адрес. Но теоретически мы можем попытаться достучаться к этим данным через интроспекцию кадров стека.

Править - История - Печать - Последние изменения - Поиск
Редакция от 19.02.2019 14:14